跳到主要内容

配置 cpp 环境

前置概念

虽然早在大一就已经学习过 C 语言了,但是因为一直没有机会使用早就忘的差不多了,现在要开始复习数据结构和算法,然而大部分资料都是基于 C 语言写的(毕竟是大部分高级语言的爹),所以这里重新学习一下 C 语言,在接下来的数据结构和算法学习中,先使用 C 语言编写一遍再想办法移植到其它的高级语言上去,借此机会可以学习到更多的基础知识,以及高级语言的特性

#include <stdio.h>

int main()
{
printf("Hello, World! \n");
return 0;
}

在 GNU 工具集里面,开发时常见到的几个罗列如下

工具说明
gccGNU C 语言编译器。
g++GNU C++ 语言编译器。
ldGNU 链接器,将目标文件和库文件链接起来,创建可执行程序和动态链接库。
ar生成静态库 .a ,可以编辑和管理静态链接库。
make生成器,可以根据 makefile 文件自动编译链接生成可执行程序或库文件。
gdb调试器,用于调试可执行程序。
ldd查看可执行文件依赖的共享库(扩展名 .so,也叫动态链接库)。

gcc:是GCC中的GUN C Compiler(C 编译器) g++:是GCC中的GUN C++ Compiler(C++编译器)

各种文件后缀

C++实现源代码的扩展名
UNIXC、cc、cxx、c
GNU C++C、cc、cxx、cpp、c++
Borland C++Cpp
Microsoft Visual C++cpp、cxx、cc

配置环境

如果是 Linux 环境则首先检查一下是否已经安装了 GNU 编译器

gcc -v

如果是 Windows 环境有 MinGW 和 MSVC 两种方案

  • MSVC:Microsoft Visual C++ Compiler,即微软自己的编译器
  • MinGW:GNU 在 Linux 下面鼎鼎大名的 gcc/g++,MinGW 则是指 Minimalist GNU for Windows 的缩写,它是一个可自由使用和自由发布的 Windows 特定头文件和使用 GNU 工具集导入库的集合,允许你在 GNU/Linux 和Windows平台生成本地的 Windows 程序而不需要第三方 C 运行时库。

因为 MSVC 需要下载 Build Tools for Visual Studio 包体有点大(巨硬安装 VS2019 的那个工具),所以这里使用 MinGW(因为都是 GCC 所以和 Linux 自带的命令一致)

首先下载 MinGW

然后把 bin 目录添加到环境变量里面去

Makefile 文件是什么?

Makefile 可以简单的认为是一个工程文件的编译规则,描述了整个工程的编译和链接等规则。其中包含了那些文件需要编译,那些文件不需要编译,那些文件需要先编译,那些文件需要后编译,那些文件需要重建等等。编译整个工程需要涉及到的,在 Makefile 中都可以进行描述。换句话说,Makefile 可以使得我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数。

在 Windows 下作开发的话不需要去考虑这个问题,因为 Windows 下的集成开发环境(IDE)已经内置了 Makefile,或者说会自动生成 Makefile,我们不用去手动编写

以 Linux 下的 C语言开发为例来具体说明一下,多文件编译生成一个文件,编译的命令如下所示:

gcc -o outfile name1.c name2.c ...

outfile 要生成的可执行程序的名字,nameN.c 是源文件的名字。这是我们在 Linux 下使用 gcc 编译器编译 C 文件的例子。如果我们遇到的源文件的数量不是很多的话,可以选择这样的编译方式。如果源文件非常的多的话,就会遇到下面的这些问题。

1、编译的时候需要链接库的问题。拿C语言来说,编译的时候 gcc 只会默认链接一些基本的C语言标准库,很多源文件依赖的标准库都需要我们手动链接。

下面列举了一些需要我们手动链接的标准库: name1.c 用到了数学计算库 math 中的函数,我们得手动添加参数 -Im; name4.c 用到了小型数据库 SQLite 中的函数,我们得手动添加参数 -lsqlite3; name5.c 使用到了线程,我们需要去手动添加参数 -lpthread。

因为有很多的文件,还要去链接很多的第三方库。所以在编译的时候命令会很长,并且在编译的时候我们可能会涉及到文件链接的顺序问题,所以手动编译会很麻烦。

如果使用 Makefile 就不一样了,它会彻底简化编译的操作。把要链接的库文件放在 Makefile 中,制定相应的规则和对应的链接顺序。这样只需要执行 make 命令,工程就会自动编译。每次想要编译工程的时候就执行 make ,省略掉手动编译中的参数选项和命令,非常的方便。

cpp 项目的结构

- project
- .gitignore
- README.md
- LICENCE.md
- CMakeLists.txt
- cmake
- FindSomeLib.cmake
- something_else.cmake
- include
- project
- lib.hpp
- src
- CMakeLists.txt
- lib.cpp
- apps
- CMakeLists.txt
- app.cpp
- tests
- CMakeLists.txt
- testlib.cpp
- docs
- CMakeLists.txt
- extern
- googletest
- scripts
- helper.py

References